package com.superb.common.security.utils;

import cn.dev33.satoken.stp.StpUtil;
import com.superb.common.core.enums.SuperbCode;
import com.superb.common.core.exception.SuperbException;
import com.superb.common.core.model.Result;
import com.superb.common.security.entity.Organization;
import com.superb.common.security.entity.SuperbTenant;
import com.superb.common.security.entity.SuperbUser;
import com.superb.common.security.feign.RemoteSecuritySystemService;
import com.superb.common.utils.SpringContextUtils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * 登录鉴权助手
 * user_type 为 用户类型 同一个用户表 可以有多种用户类型 例如 pc,app deivce 为 设备类型 同一个用户类型 可以有 多种设备类型 例如 web,ios
 * 可以组成 用户类型与设备类型多对多的 权限灵活控制
 * 多用户体系 针对 多种用户类型 但权限控制不一致 可以组成 多用户类型表与多设备类型 分别控制权限
 * @Author: ajie
 * @CreateTime: 2024-06-19 09:12
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class SuperbUtils {

    private static final RemoteSecuritySystemService remoteSecuritySystemService = SpringContextUtils.getBean(RemoteSecuritySystemService.class);

    /**
     * 通过租户ID获取租户信息
     * @return
     */
    public static SuperbTenant getTenantInfo() {
        Result<SuperbTenant> result = remoteSecuritySystemService.getTenantInfo();
        if (result.getCode() == 200 && result.isSuccess()) {
            return result.getResult();
        } else {
            throw new SuperbException(SuperbCode.TENANT_NULL, result.getMessage());
        }
    }

    /**
     * 通过登录id获取用户信息
     * @return
     */
    public static SuperbUser current() {
        Result<SuperbUser> result = remoteSecuritySystemService.getUserById(StpUtil.getLoginId().toString());
        if (result.getCode() == 200 && result.isSuccess()) {
            return result.getResult();
        } else {
            throw new SuperbException(SuperbCode.TENANT_NULL, result.getMessage());
        }
    }

    /**
     * 获取当前用户部门
     * @return
     */
    public static Organization getOrganization() {
        Result<Organization> result = remoteSecuritySystemService.getOrganization();
        if (result.getCode() == 200 && result.isSuccess()) {
            return result.getResult();
        } else {
            throw new SuperbException(SuperbCode.ORGANIZ_NULL, result.getMessage());
        }
    }

    /**
     * 当前登录用户权限列表
     * @return
     */
    public static List<String> permissionList() {
        Result<List<String>> result = remoteSecuritySystemService.getUserPermissionList(StpUtil.getLoginIdAsString());
        if (result.getCode() == 200 && result.isSuccess()) {
            return result.getResult();
        } else {
            throw new SuperbException(SuperbCode.USER_NULL, result.getMessage());
        }
    }

    /**
     * 当前登录用户角色列表
     * @return
     */
    public static List<String> roleList() {
        Result<List<String>> result = remoteSecuritySystemService.getUserRoleList(StpUtil.getLoginIdAsString());
        if (result.getCode() == 200 && result.isSuccess()) {
            return result.getResult();
        } else {
            throw new SuperbException(SuperbCode.USER_NULL, result.getMessage());
        }
    }

}
